#ifndef __ECGACORE_H_
#define __ECGACORE_H_
#include <cstdlib>
#include <assert.h>
#include <iostream>
#include <ctype.h>
#include <stdlib.h>
#include "GAcore.hpp"
#include "GAmodSettings.hpp"
#include "common.hpp"
#include "CompactPop.hpp"
#include "popolazione.hpp"
#include "./ecga/parameter.hpp"
#include "./ecga/ecga.hpp"        // ECGA code
#include "./ecga/random.hpp"      // random number generator
#include "./ecga/utility.hpp"     // utility functions and procedures
#include "./ecga/parameter.hpp"   // parameters for the ECGA





class ECGAcoreException : public GAcoreException
{
    public:
    ECGAcoreException(char *mess) : GAcoreException(mess) {};
};

/** \class ECGAcore
 *  \brief It timplements an ECGA evolvolutionary algorithm.
 */

class ECGAcore : public GAcore 
{
	public:
	
	    enum params {
        PARAM_ALL           = 0xFFFFFFFF,       //!< Calcola tutti i parametri
        PARAM_HAM_BEST      = 0x00000020,       //!< Calcola distanza di hamming dall'individuo migliore
        PARAM_N_CROSS       = 0x00000010,       //!< Calcola il numero di crossover (per generazione) nell'ultima chiamata a \c run_generation
        PARAM_N_MUT         = 0x00000008,       //!< Calcola il numero di mutazioni per individuo (per generazione) nell'ultima chiamata a \c run_generation
        PARAM_VAR_SCORE     = 0x00000004,       //!< Varianza del valore di fitness su tutta la popolazione
        PARAM_MEAN_SCORE    = 0x00000002,       //!< Fitness medio
        PARAM_BEST_SCORE    = 0x00000001        //!< Best score
    };
	
	private:

	Popolazione *M;
	parameter *pr;
	ecga * ECGA;
	randomG * rnd;

    public:
		//empty
		ECGAcore(Validator *val,GAmodSettings &settings) throw(ECGAcoreException);
		int loadSettings(GAmodSettings &settings,load_exc le = GAcore::THROW_EXCEPTION) throw(ECGAcoreException);
		int getGenerationData(GAmodSettings &settings,HERAuint32 lista = 0);
		int runGeneration(int num);
		/*
		 *
		 *To get a fake population
		 */
    void getPopolazione(Popolazione &p){p = (*M);};
		~ECGAcore();


	
};



#endif